/**
  ******************************************************************************
  * @file    stm32f7xx_hal_timebase_TIM.c
  * @brief   HAL time base based on the hardware TIM.
  *
  *          This file overrides the native HAL time base functions (defined as weak)
  *          the TIM time base:
  *           + Initializes the TIM peripheral generate a Period elapsed Event each 1ms
  *           + HAL_IncTick is called inside HAL_TIM_PeriodElapsedCallback ie each 1ms
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */

#include "stm32f7xx_hal.h"
#include "stm32f7xx_hal_tim.h"
#include "main.h"
TIM_HandleTypeDef htim6;

/**
  * @brief  This function configures the TIM6 as a time base source.
  *         The time source is configured  to have 1ms time base with a dedicated
  *         Tick interrupt priority.
  * @note   This function is called  automatically at the beginning of program after
  *         reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
  * @param  TickPriority: Tick interrupt priority.
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) {
	RCC_ClkInitTypeDef    clkconfig;
	uint32_t              uwTimclock = 0;
	uint32_t              uwPrescalerValue = 0;
	uint32_t              pFLatency;

	/* Configure the TIM6 IRQ priority */
	HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority, 0);

	/* Enable the TIM6 global Interrupt */
	HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);

	/* Enable TIM6 clock */
	__HAL_RCC_TIM6_CLK_ENABLE();

	/* Get clock configuration */
	HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);

	/* Compute TIM6 clock */
	uwTimclock = (2 * HAL_RCC_GetPCLK1Freq()); //2 * 16MHz = 32MHz     default sysclk * 2(multiplier) = f_tim6

	/* Compute the prescaler value to have TIM6 counter clock equal to 1kHz (1ms period)*/
	uwPrescalerValue = (uint32_t)((uwTimclock / 1000000U) - 1U);  //Prescaler = 31

	/* Initialize TIM6 */
	htim6.Instance = TIM6;

	/* Initialize TIMx peripheral as follow:
	  + Period = [(TIM6CLK/1000) - 1]. to have a 1ms time base.
	  + Prescaler = ((uwTimclock/1000000) - 1) to have a 1kHz counter clock.
	  + ClockDivision = 0
	  + Counter direction = Up
	*/
	htim6.Init.Period = (1000000U / 1000U) - 1U;
	htim6.Init.Prescaler = uwPrescalerValue;
	htim6.Init.ClockDivision = 0;
	htim6.Init.CounterMode = TIM_COUNTERMODE_UP;

	if(HAL_TIM_Base_Init(&htim6) == HAL_OK) {
		/* Start the TIM Time Base generation in interrupt mode */
		return HAL_TIM_Base_Start_IT(&htim6);
	}

	/* Return function status */
	return HAL_ERROR;
}

/**
  * @brief  Suspend Tick increment.
  * @note   Disable the tick increment by disabling TIM6 update interrupt.
  * @param  None
  * @retval None
  */
void HAL_SuspendTick(void) {
	/* Disable TIM6 update Interrupt */
	__HAL_TIM_DISABLE_IT(&htim6, TIM_IT_UPDATE);
}

/**
  * @brief  Resume Tick increment.
  * @note   Enable the tick increment by Enabling TIM6 update interrupt.
  * @param  None
  * @retval None
  */
void HAL_ResumeTick(void) {
	/* Enable TIM6 Update interrupt */
	__HAL_TIM_ENABLE_IT(&htim6, TIM_IT_UPDATE);
}

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
